package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.mapper.DeptMapper;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpExprService;
import com.itheima.service.EmpService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements EmpService {

    @Resource
    private DeptMapper deptMapper;

    @Resource
    private EmpExprService empExprService;

    /**
     * 查询分页数据
     *
     * @param param
     * @return
     */
    @Override
    public PageResult queryPage(EmpQueryParam param) {
        //PageHelper.startPage();
        // 分页参数
        Page<Emp> page = Page.of(param.getPage(), param.getPageSize());
        // 先不考虑分页
        // 构建查询条件
        // like,eq... (条件表达式为true，则拼接条件, 条件对应字段的方法名，值)
        Page<Emp> pageInfo = lambdaQuery()
                .like(StringUtils.hasLength(param.getName()), Emp::getName, param.getName())
                .eq(null != param.getGender(), Emp::getGender, param.getGender())
                .ge(null != param.getBegin(), Emp::getEntryDate, param.getBegin())
                .le(null != param.getEnd(), Emp::getEntryDate, param.getEnd())
                .page(page);
        // 解决部门名称为空的问题，在部门表中
        // 提取查询到员工的部门id
        List<Integer> deptIds = pageInfo.getRecords().stream().map(Emp::getDeptId).collect(Collectors.toList());
        // 根据部门id批量查询部门信息
        List<Dept> deptList = deptMapper.selectBatchIds(deptIds);
        // 遍历员工列表，为每一个员工设置部门名称
        pageInfo.getRecords().forEach(emp -> {
            deptList.stream()
                    // 过滤，满足条件的留下
                    .filter(dept -> dept.getId().equals(emp.getDeptId()))// 流中数据 dept对象 list
                            .findFirst()// 找第一个元素 单个部门对象
                    // 如果存在，则执行括号里的方法
                    .ifPresent(dept -> emp.setDeptName(dept.getName()));

            /*deptList.forEach(dept -> {
                if (dept.getId().equals(emp.getDeptId())) {
                    emp.setDeptName(dept.getName());
                }
            });*/
        });

        return new PageResult(pageInfo.getTotal(), pageInfo.getRecords());
    }

    @Transactional
    @Override
    public void updateEmp(Emp emp) {
        //1. 更新员工的基本信息
        emp.setUpdateTime(LocalDateTime.now());
        updateById(emp);
        //2. 删除员工工作经历
        List<Integer> ids = List.of(emp.getId());
        //empExprService.remove(new LambdaQueryWrapper<EmpExpr>().in(EmpExpr::getEmpId, ids));
        empExprService.deleteByEmpIds(ids);
        //3. 添加新的工作经历
        //非空判断
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)) {
            // 设置工作经历中的员式，给经历与员工关联
            exprList.forEach(expr -> expr.setEmpId(emp.getId()));
            // 批量添加
            empExprService.saveBatch(exprList);
        }
    }

    @Transactional
    @Override
    public void add(Emp emp) {
        //1.先添加员工基本信息
        // 补充其它属性
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(emp.getCreateTime());
        // 密码，TODO 密码加密再存储
        emp.setPassword("123456");
        save(emp);
        //2.批量添加员工工作经历
        //获取新增员工id
        Integer empId = emp.getId();
        // 遍历
        //非空判断
        List<EmpExpr> exprList = emp.getExprList();
        //if (exprList != null && exprList.size() > 0) {
        // 工作经验丰富
        if (!CollectionUtils.isEmpty(exprList)) {
            //int i = 1/0;
            // 设置工作经历中的员式，给经历与员工关联
            exprList.forEach(expr -> expr.setEmpId(empId));
            // 批量添加
            empExprService.saveBatch(exprList);
        }
    }

    @Override
    public Emp getInfo(Integer id) {
        // 查询员工的信息表
        Emp emp = getById(id);
        // 查询员工工作经历
        List<EmpExpr> empExprList = empExprService.selectByEmpId(id);
        // 设置员工的工作经历
        emp.setExprList(empExprList);
        return emp;
    }

    @Override
    @Transactional
    public void deleteByIds(List<Integer> ids) {
        if(!CollectionUtils.isEmpty(ids)) {
            //1. 删除员工信息
            removeBatchByIds(ids);
            //2. 删除员工的工作经历
            empExprService.deleteByEmpIds(ids);
        }
    }
}
